// ScopedTimer.hpp
#ifndef YOLOS_EDGEPLATFORM_SCOPEDTIMER_HPP
#define YOLOS_EDGEPLATFORM_SCOPEDTIMER_HPP

/**
 * @file ScopedTimer.hpp
 * @brief YOLOs-CPP-EdgePlatform 基于 RAII 的计时工具
 *
 * 本文件定义了 ScopedTimer 类，用于测量代码块的执行时间以进行性能分析。
 * 当定义 TIMING_MODE 时，它会记录执行时间并在析构时输出到标准输出；
 * 否则提供空实现。
 *
 * @author FANKYT (改编自 YOLOs-CPP 项目)
 * @date 2025
 */

#include <chrono>
#include <iostream>
#include <string>
#include "tools/Config.hpp"

#ifdef TIMING_MODE
class ScopedTimer {
public:
    /**
     * @brief 构造函数，用于测量命名代码块的执行时间
     * @param name 被计时的代码块名称
     */
    ScopedTimer(const std::string &name)
        : func_name(name), start(std::chrono::high_resolution_clock::now()) {}

    /**
     * @brief 析构函数，计算并打印经过的时间（毫秒）
     */
    ~ScopedTimer() {
        auto stop = std::chrono::high_resolution_clock::now();
        std::chrono::duration<double, std::milli> duration = stop - start;
        std::cout << "\033[31m[TIMER] " << func_name << " 耗时 "
                  << duration.count() << " ms\033[0m" << std::endl;
    }

private:
    std::string func_name;                                              // 函数名称
    std::chrono::time_point<std::chrono::high_resolution_clock> start;  // 开始时间点
};
#else
class ScopedTimer {
public:
    ScopedTimer(const std::string &name) {}  // 空实现
    ~ScopedTimer() {}                        // 空实现
};
#endif // TIMING_MODE

#endif // YOLOS_EDGEPLATFORM_SCOPEDTIMER_HPP
